package com.duubee.btframe.service;

import com.duubee.btframe.vo.BtCondition;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.io.Serializable;
import java.util.List;

/**
 * 通用查询业务类
 */

@SuppressWarnings(value = "all")
public interface BtCommonService {

    /**
     * 通过分页查询
     *
     * @param t           实体类型
     * @param btPage      分页对象
     * @param btCondition 条件构造器
     * @param <T>         t
     * @return 分页结果对象
     */
    <T> IPage<T> queryByPaging(Class<T> t, Page btPage, BtCondition btCondition);

    /**
     * 通过id查询单个
     *
     * @param t   实体类型
     * @param id  id
     * @param <T> t
     * @return 对象
     */
    <T> T querySingleById(Class<T> t, Serializable id);

    /**
     * 通过条件查询单个
     *
     * @param t           实体对象
     * @param btCondition 条件构造器
     * @param <T>         t
     * @return 对象
     */
    <T> T querySingle(Class<T> t, BtCondition btCondition);

    /**
     * 通过条件查询单个
     *
     * @param t           实体类型
     * @param btCondition 条件构造
     * @param <T>         t
     * @return 实体
     */
    <T> T querySingleLimit(Class<T> t, BtCondition btCondition);

    /**
     * 查询所有数据
     *
     * @param t   实体对象
     * @param <T> t
     * @return 数据集合
     */
    <T> List<T> queryList(Class<T> t);

    /**
     * 通过条件查询数据
     *
     * @param t           实体对象
     * @param btCondition 条件构造器
     * @param <T>         t
     * @return 数据集合
     */
    <T> List<T> queryList(Class<T> t, BtCondition btCondition);

//    /**
//     * 保存
//     * @param entity 保存对象
//     * @return 结果
//     */
//    <T> boolean save(T entity);


//    /**
//     * 插入
//     * @param entity 插入对象
//     * @return 结果
//     */
//    <T> boolean insert(T entity);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     * @param <T>    t
     * @return 结果
     */
    <T> boolean updateById(T entity);

    /**
     * 根据 条件 修改
     *
     * @param entity      实体对象
     * @param btCondition 条件构造器
     * @param <T>         t
     * @return 结果
     */
    <T> boolean updateByCondition(T entity, BtCondition btCondition);

    /**
     * 根据 ID 修改
     *
     * @param entity      实体对象
     * @param disposeNull 跳过(Null)数据  (默认为true:跳过)
     * @param <T>         t
     * @return 结果
     */
    <T> boolean updateById(T entity, boolean disposeNull);

    /**
     * 根据 条件 修改
     *
     * @param entity      实体对象
     * @param btCondition 条件构造器
     * @param disposeNull 跳过(Null)数据  (默认为true:跳过)
     * @param <T>         t
     * @return 结构
     */
    <T> boolean updateByCondition(T entity, BtCondition btCondition, boolean disposeNull);

    /**
     * 根据 ID 删除
     *
     * @param t   删除的实体类型
     * @param id  删除的主键key
     * @param <T> t
     * @return 结构
     */
    <T> boolean removeById(Class<T> t, Serializable id);

    /**
     * 根据 条件 删除
     *
     * @param t           删除的实体类型
     * @param btCondition 删除的条件
     * @param <T>         t
     * @return 结构
     */
    <T> boolean removeByCondition(Class<T> t, BtCondition btCondition);

    /**
     * 根据 条件 统计
     *
     * @param t           实体类型
     * @param btCondition 条件构造器
     * @param <T>         t
     * @return 数量
     */
    <T> long count(Class<T> t, BtCondition btCondition);


    /**
     * 更新或保存(需要在数据表中创建唯一索引  UNIQUE、BTREE)
     *
     * @param t           对象
     * @param btCondition 条件构造器
     * @param <T>         t
     * @return 结果
     */
    <T> boolean saveOrUpdateByUNIQUE(T t, BtCondition btCondition);

}
